package com.whenjun.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.ifootbook.util.Base64;
import com.ifootbook.util.EmptyUtil;
import com.ifootbook.util.FootBookException;
import com.ifootbook.util.Util;
import com.whenjun.common.Base;
import com.whenjun.common.LoggerParent;
import com.whenjun.entity.RequestIsc;
import com.whenjun.mapper.RequestIscMapper;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class ArtemisPostUtil extends LoggerParent {

	@Autowired
	private RequestIscMapper requestIscMapper;

	/**
	 * 请根据自己的appKey和appSecret更换static静态块中的三个参数. [1 host]
	 * 如果你选择的是同现场环境对接,host要修改为现场环境的ip,https端口默认为443，http端口默认为80.例如10.33.25.22:443 或者10.33.25.22:80
	 * appKey和appSecret请按照或得到的appKey和appSecret更改.
	 * TODO 调用前看清接口传入的是什么，是传入json就用doPostStringArtemis方法，是表单提交就用doPostFromArtemis方法,下载图片doPostStringImgArtemis方法
	 */
	static {
		ArtemisConfig.host = Base.ISC_HOST; // 代理API网关nginx服务器ip端口
		ArtemisConfig.appKey = Base.ISC_APPKEY;  // 秘钥appkey
		ArtemisConfig.appSecret = Base.ISC_APPSECRET;// 秘钥appSecret
	}
	

	/**
	 * 能力开放平台的网站路径
	 * TODO 路径不用修改，就是/artemis
	 */
	private static final String ARTEMIS_PATH = "/artemis";

	/**
	 * 调用post请求表单类型的接口,这里以简单的加法接口示例
	 *
	 * @return
	 */
	public static String callPostFormApi() {
		/**
		 * https://open8200.hikvision.com/artemis-portal/document?version=58&docId=278&apiBlock=1
		 * 根据API文档可以看出来,这是一个POST请求的Rest接口, 而且传入的参数值为是一个form值.
		 * ArtemisHttpUtil工具类提供了doPostFormArtemis这个函数, 一共六个参数在文档里写明其中的意思. 因为接口是https,
		 * 所以第一个参数path是个hashmap类型,请put一个key-value, querys为传入的参数.
		 * paramMap 为form的参数值.
		 * queryString不存在,所以传入null,accept和contentType不指定按照默认传null.
		 * header没有额外参数可不传,指定为null
		 */
		final String getCamsApi = ARTEMIS_PATH + "/api/scpms/v1/eventLogs/searches";
		Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
		paramMap.put("a", "3");
		paramMap.put("b", "2");
		Map<String, String> path = new HashMap<String, String>(2) {
			{
				put("https://", getCamsApi);
			}
		};
		String result = ArtemisHttpUtil.doPostFormArtemis(path, paramMap, null, null, "application/json",null);
		return result;
	}

	/**
	 * 调用POST请求类型(application/json)接口，这里以入侵报警事件日志为例
	 * https://10.33.47.50:443/artemis//api/scpms/v1/eventLogs/searches
	 *
	 * @return
	 */
	public static String callPostStringApi(){
		/**
		 * https://10.33.47.50:443/artemis//api/scpms/v1/eventLogs/searches
		 * 根据API文档可以看出来，这是一个POST请求的Rest接口，而且传入的参数值为一个json
		 * ArtemisHttpUtil工具类提供了doPostStringArtemis这个函数，一共六个参数在文档里写明其中的意思，因为接口是https，
		 * 所以第一个参数path是一个hashmap类型，请put一个key-value，query为传入的参数，body为传入的json数据
		 * 传入的contentType为application/json，accept不指定为null
		 * header没有额外参数可不传,指定为null
		 *
		 */
		final String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/person/advance/personList";
		Map<String, String> path = new HashMap<String, String>(2) {
			{
				put("https://", getCamsApi);//根据现场环境部署确认是http还是https
			}
		};

		JSONObject jsonBody = new JSONObject();
		jsonBody.put("pageNo", 1);
		jsonBody.put("pageSize", 20);
		jsonBody.put("srcType", "defence");
		jsonBody.put("startTime", "2019-02-13 08:00:00");
		jsonBody.put("endTime", "2019-02-14 08:00:00");
		jsonBody.put("327681", 1);
		jsonBody.put("srcName", "防区1");
		jsonBody.put("pageNo", "1");
		jsonBody.put("pageSize", "10");
		String body = jsonBody.toJSONString();

		String result =ArtemisHttpUtil.doPostStringArtemis(path,body,null,null,"application/json",null);// post请求application/json类型参数
		return result;
	}

	/**
	 * 调用POST请求下载图片类型接口，这里以获取门禁事件图片接口为例
	 * https://10.40.239.202/artemis/api/acs/v1/event/pictures
	 *
	 * @return
	 */
	public synchronized String callPostImgStringApi(String... url){
		/**
		 * https://10.40.239.202/artemis/api/acs/v1/event/pictures
		 * 根据API文档可以看出来，这是一个POST请求的Rest接口，而且传入的参数值为一个json
		 * ArtemisHttpUtil工具类提供了doPostStringImgArtemis这个函数，一共六个参数在文档里写明其中的意思，因为接口是https，
		 * 所以第一个参数path是一个hashmap类型，请put一个key-value，query为传入的参数，body为传入的json数据
		 * 传入的contentType为application/json，accept不指定为null
		 * header没有额外参数可不传,指定为null
		 *
		 */
		final String VechicleDataApi = ARTEMIS_PATH +"/api/frs/v1/application/picture";
		Map<String,String> path = new HashMap<String,String>(2){
			{
				put("https://",VechicleDataApi);
			}
		};

		String respString = null;
		
		JSONObject jsonBody = new JSONObject();
//		jsonBody.put("svrIndexCode", "30a80833-9ced-46c0-bf53-441a6121856e");
		jsonBody.put("url", "/pic?7dd951i1f-e*0c34381d6195m5ep=t=i1p*i=d1s*i=d7b*iddeb*76d6c208c-9b1111--70f3728zd7cs=5i68=");
		String body = jsonBody.toJSONString();
		System.out.println("body: "+body);
		HttpResponse result = ArtemisHttpUtil.doPostStringImgArtemis(path,body,null,null,"application/json",null);
		try {
			HttpResponse resp = result;
			if (200==resp.getStatusLine().getStatusCode()) {
				HttpEntity entity = resp.getEntity();
//				InputStream in = entity.getContent();
//				Tools.savePicToDisk(in, "d:/", "test.jpg");
				
				 // 解析数据
	            String data = EntityUtils.toString(entity);
	            System.out.println(data);
	            
	            JSONObject jsonObject = JSONObject.parseObject(data);
	            
	            respString = "data:image/jpeg;base64," + jsonObject.getString("data");
//	            base64ChangeImage(jsonObject.getString("data"), null);
	            
	         // isc 请求信息保存
			}else{
				System.out.println("下载出错");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return respString;
	}
	
	

	
	/**
	 * @author 万文俊
	 * 请求方法改造
	 */
	public synchronized JSON callPostApi(String url,Object object){
		/**
		 * https://10.33.47.50:443/artemis//api/scpms/v1/eventLogs/searches
		 * 根据API文档可以看出来，这是一个POST请求的Rest接口，而且传入的参数值为一个json
		 * ArtemisHttpUtil工具类提供了doPostStringArtemis这个函数，一共六个参数在文档里写明其中的意思，因为接口是https，
		 * 所以第一个参数path是一个hashmap类型，请put一个key-value，query为传入的参数，body为传入的json数据
		 * 传入的contentType为application/json，accept不指定为null
		 * header没有额外参数可不传,指定为null
		 *
		 */
		final String getCamsApi = ARTEMIS_PATH + url;
		Map<String, String> path = new HashMap<String, String>(2) {
			{
				put("https://", getCamsApi);//根据现场环境部署确认是http还是https
			}
		};
		
		String body = JSON.toJSONString(object);

		String result = ArtemisHttpUtil.doPostStringArtemis(path,body,null,null,"application/json",null);// post请求application/json类型参数
		System.out.println("result_req:                " + body);
		System.out.println("result:                " + result);
		Feature[] features = {Feature.AllowISO8601DateFormat};
		JSONObject jsonObject = JSON.parseObject(result, features);
		
		String code = jsonObject.getString("code");
		String msg = jsonObject.getString("msg") == null ? "api error" : jsonObject.getString("msg");
		
		// isc 请求信息保存
		try {
			String requestId = null;
			if (!EmptyUtil.isEmpty(SaTokenUtil.getRequestId())) {
				requestId = SaTokenUtil.getRequestId();
			}

			RequestIsc requestIsc = new RequestIsc();

			requestIsc.setId(Util.getUUID32());
			requestIsc.setUri(url);
			requestIsc.setRequestBody(body);
			requestIsc.setRequestId(requestId);
			requestIsc.setRequestTime(LocalDateTime.now());
			requestIsc.setException(msg);
			requestIsc.setResponseBody(result);

			requestIscMapper.insert(requestIsc);

		} catch (Exception e) {
			e.printStackTrace();
			log.error("request_isc 新增异常：{}",e.getMessage() );
		}

		if(code != null && !"0".equals(code)) {
			 throw new FootBookException(msg);
		}
		Object dataObject = jsonObject.get("data");
		if (dataObject instanceof JSONArray) {
			return jsonObject.getJSONArray("data");
		}else if (dataObject instanceof JSONObject) {
			return jsonObject.getJSONObject("data");
		}else {
//			throw new MyException("数据为空。isc返回信息：" + msg);
			log.info("数据为空。isc返回信息：" + msg);
			return null;
		}
	}
	
	
	/**
     * BASE转图片
     * @param baseStr  base64字符串
     * @param imagePath 生成的图片
     * @return
     */
    public boolean base64ChangeImage(String baseStr,String imagePath){
        if (baseStr == null){
            return false;
        }
        try {
            // 解密
            byte[] b = Base64.decode(baseStr);
            // 处理数据
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            OutputStream out = new FileOutputStream("/home/tomcat/apache-tomcat-8.5.35/webapps/images/face/" + System.currentTimeMillis() + ".jpg");
            out.write(b);
             out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

	public static void main(String[] args) {
		String fomeResult =callPostFormApi();
		System.out.println("fomeResult结果示例: "+fomeResult);
//		String StringeResult = callPostStringApi();
//		System.out.println("StringeResult结果示例: "+StringeResult);
	}
}
